package com.bootdo.system.service.impl;

import com.bootdo.common.utils.Query;
import com.bootdo.common.utils.StringUtils;
import com.bootdo.system.domain.EquipSumDO;
import com.bootdo.system.domain.SystemSetDO;
import org.apache.commons.io.CopyUtils;
import org.apache.shiro.util.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.bootdo.system.dao.ScanequipDao;
import com.bootdo.system.domain.ScanequipDO;
import com.bootdo.system.service.ScanequipService;



@Service
public class ScanequipServiceImpl implements ScanequipService {

	@Autowired
	private ScanequipDao scanequipDao;

	@Autowired
	private ScanequipService scanequipService;
	
	@Override
	public ScanequipDO get(Integer id){
		return scanequipDao.get(id);
	}
	
	@Override
	public List<ScanequipDO> list(Map<String, Object> map){
		return scanequipDao.list(map);
	}
	
	@Override
	public int count(Map<String, Object> map){
		return scanequipDao.count(map);
	}
	
	@Override
	public int save(ScanequipDO scanequip){
		return scanequipDao.save(scanequip);
	}
	
	@Override
	public int update(ScanequipDO scanequip){
		return scanequipDao.update(scanequip);
	}
	
	@Override
	public int remove(Integer id){
		return scanequipDao.remove(id);
	}
	
	@Override
	public int batchRemove(Integer[] ids){
		return scanequipDao.batchRemove(ids);
	}

	@Override
	public List<ScanequipDO> equipmentList(Map<String, Object> map) {
		return scanequipDao.equipmentList(map);
	}

	@Override
	public int countEquipment(Map<String, Object> map) {
		return scanequipDao.countEquipment(map);
	}

	/***
	 * 获取首页各种设备类型数据
	 * @param scanequipDO
	 * @return
	 */
	@Override
	public Map<String, Object> getScanequipCount(ScanequipDO scanequipDO) {
		Map<String, Object> map = new HashMap<String, Object>();
		//获取总设备数
		int allCount = scanequipDao.getAllCount(scanequipDO);
		//获取在线设备数
		int onlineCount = scanequipDao.getOnlineCount(scanequipDO);
		//获取电脑数
		int computureCount = scanequipDao.getComputureCount(scanequipDO);
		//获取当日新增数
		int addCount = scanequipDao.getAddCount(scanequipDO);
		map.put("allCount", allCount);
		map.put("onlineCount", onlineCount);
		map.put("computureCount", computureCount);
		map.put("addCount", addCount);

		//获取入网趋势图也就是最近几（7）天的在线
		List<EquipSumDO> list1 = scanequipDao.getListByDate(scanequipDO);
		map.put("list1", list1);

		//获取操作系统饼状图
		int nCanuseDay = scanequipDao.getDayNumber("'scanCanuseDay'");
		if (nCanuseDay <= 10) {
			nCanuseDay = 10;
		}
		List<ScanequipDO> list = scanequipDao.getOstypeNumber(nCanuseDay);

		//获取设备类型饼状图（linux，windows，mac归于pc类型，android，ios归于移动设备，switch归于交换机，printer归于打印机，其他的类型或者为空的为未知设备）
		List<ScanequipDO> list2 = new ArrayList<ScanequipDO>();
		List<ScanequipDO> list3 = new ArrayList<ScanequipDO>();
		if(!CollectionUtils.isEmpty(list)) {
			int sum1 = 0;
			int sum2 = 0;
			int sum3 = 0;
			int sum4 = 0;
			int sum5 = 0;
			for(ScanequipDO data : list) {
				if(StringUtils.equals(data.getOstype(),"windows")) {
					sum1 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"linux")) {
					sum2 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"android")) {
					sum3 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"mac")) {
					sum4 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"ios")) {
					sum5 += data.getSum();
				}
			}
			ScanequipDO scanequipDO1 = new ScanequipDO();
			scanequipDO1.setSum(sum1);
			scanequipDO1.setOstypeName("Windows");
			list2.add(scanequipDO1);

			ScanequipDO scanequipDO2 = new ScanequipDO();
			scanequipDO2.setSum(sum2);
			scanequipDO2.setOstypeName("Linux");
			list2.add(scanequipDO2);

			ScanequipDO scanequipDO3 = new ScanequipDO();
			scanequipDO3.setSum(sum3);
			scanequipDO3.setOstypeName("Android");
			list2.add(scanequipDO3);

			ScanequipDO scanequipDO4 = new ScanequipDO();
			scanequipDO4.setSum(sum4);
			scanequipDO4.setOstypeName("MacOs");
			list2.add(scanequipDO4);

			ScanequipDO scanequipDO5 = new ScanequipDO();
			scanequipDO5.setSum(sum5);
			scanequipDO5.setOstypeName("Ios5");
			list2.add(scanequipDO5);


			int sum11 = 0;
			int sum22 = 0;
			int sum33 = 0;
			int sum44 = 0;
			int sum55 = 0;
			for(ScanequipDO data : list) {
				if(StringUtils.equals(data.getOstype(),"linux") || StringUtils.equals(data.getOstype(),"windows") || StringUtils.equals(data.getOstype(),"mac") ) {
					sum11 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"android") || StringUtils.equals(data.getOstype(),"ios")) {
					sum22 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"switch")) {
					sum33 += data.getSum();
				}else if(StringUtils.equals(data.getOstype(),"printer")) {
					sum44 += data.getSum();
				}else {
					sum55 += data.getSum();
				}
			}
			ScanequipDO scanequipDO11 = new ScanequipDO();
			scanequipDO11.setSum(sum11);
			scanequipDO11.setOstypeName("pc类型");
			list3.add(scanequipDO11);

			ScanequipDO scanequipDO22 = new ScanequipDO();
			scanequipDO22.setSum(sum22);
			scanequipDO22.setOstypeName("移动设备");
			list3.add(scanequipDO22);

			ScanequipDO scanequipDO33 = new ScanequipDO();
			scanequipDO33.setSum(sum33);
			scanequipDO33.setOstypeName("交换机");
			list3.add(scanequipDO33);

			ScanequipDO scanequipDO44 = new ScanequipDO();
			scanequipDO44.setSum(sum44);
			scanequipDO44.setOstypeName("打印机");
			list3.add(scanequipDO44);

			ScanequipDO scanequipDO55 = new ScanequipDO();
			scanequipDO55.setSum(sum55);
			scanequipDO55.setOstypeName("未知设备");
			list3.add(scanequipDO55);
		}
		map.put("list2",list2);
		map.put("list3",list3);
		return map;
	}

	/**
	 * 获取参数值
	 * @param code
	 * @return
	 */
	@Override
	public SystemSetDO getSystemSetDetail(String code) {
		return scanequipDao.getSystemSetDetail(code);
	}

	/**
	 * 修改参数值
	 * @param systemSetDO
	 */
	@Override
	public void updateSet(SystemSetDO systemSetDO) {
		SystemSetDO systemSetDO1 = new SystemSetDO();
		BeanUtils.copyProperties(systemSetDO,systemSetDO1);
		if(StringUtils.isEmpty(systemSetDO1.getNvalue1())) {
			systemSetDO1.setNvalue1("10");
		}
		systemSetDO1.setNvalue2(null);
		systemSetDO1.setName1(null);
		systemSetDO1.setName2(null);
		systemSetDO1.setCode("scanCanuseDay");
		scanequipDao.updateSet(systemSetDO1);

		SystemSetDO systemSetDO2 = new SystemSetDO();
		BeanUtils.copyProperties(systemSetDO,systemSetDO2);
		if(StringUtils.isEmpty(systemSetDO2.getNvalue2())) {
			systemSetDO2.setNvalue2("0");
		}
		systemSetDO2.setNvalue1(null);
		systemSetDO2.setName1(null);
		systemSetDO2.setName2(null);
		systemSetDO2.setCode("scandevicehour");
		scanequipDao.updateSet(systemSetDO2);

		SystemSetDO systemSetDO3 = new SystemSetDO();
		BeanUtils.copyProperties(systemSetDO,systemSetDO3);
		if(StringUtils.isEmpty(systemSetDO3.getName1())) {
			systemSetDO3.setName1("00:00:00");
		}
		if(StringUtils.isEmpty(systemSetDO3.getName2())) {
			systemSetDO3.setName2("23:59:59");
		}
		systemSetDO3.setNvalue1(null);
		systemSetDO3.setNvalue2(null);
		systemSetDO3.setCode("scandevicetime");
		scanequipDao.updateSet(systemSetDO3);
	}

	/**
	 * 获取ip可视化页面数据
	 * @param map
	 * @return
	 */
	@Override
	public List<ScanequipDO> getVisualizationList(Map<String, Object> map) {
		List<ScanequipDO> list = scanequipDao.getVisualizationList(map);
		if(!CollectionUtils.isEmpty(list)) {
			//获取参数值(超过多少天认为ip地址可以使用，如果查询结果小于10则认为等于10)
			SystemSetDO systemSetDO = scanequipService.getSystemSetDetail("scanCanuseDay");
			int day = 10;
			if(null != systemSetDO && Integer.parseInt(systemSetDO.getNvalue()) > 10) {
				day = Integer.parseInt(systemSetDO.getNvalue());
			}
			//计算毫秒数
			long time1 = day * 24 *60 * 60 *1000;
			for(ScanequipDO data : list) {
				if(data.getNflag1() != 1) {
					//表示不在线
					long time2 = data.getScanlasttime().getTime() - data.getLasttime().getTime();
					if(time2 > time1) {
						//不可用
						data.setAvailableState(0);
					}else {
						//可用
						data.setAvailableState(1);
					}
				}
			}
		}

		return list;
	}

}
